package SlideWindows;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class L30_SubStringWithAllWord {
    /**
     * 之前没好好审题，这题的这些words长度居然一样。。 简单的做法还好，就是记得 循环是咋做的
     * 给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
     *
     * 注意子串要与 words 中的单词完全匹配，中间不能有其他字符，但不需要考虑 words 中单词串联的顺序。
     *
     *  
     *
     * 示例 1：
     *
     * 输入：
     *   s = "barfoothefoobarman",
     *   words = ["foo","bar"]
     * 输出：[0,9]
     * 解释：
     * 从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。
     * 输出的顺序不重要, [9,0] 也是有效答案。
     * 示例 2：
     *
     * 输入：
     *   s = "wordgoodgoodgoodbestword",
     *   words = ["word","good","best","word"]
     * 输出：[]
     *
     */
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> res = new ArrayList<>();
        if(s == null || s.length()==0 || words.length == 0) return res;

        HashMap<String, Integer> w_maps = new HashMap<>(), t_maps = new HashMap<>();
        int n = s.length(), len = words[0].length(), all_len = len * words.length;

        for(String word: words){
            w_maps.put(word, w_maps.getOrDefault(word, 0) + 1);
        }

        //这里right 直接从 all_len起步
        for(int left=0, right=all_len - 1; right < n ; left++, right++){
            t_maps.clear();
            //在这个窗口内，挨个挨个的确认， 注意 right需要<=>，以为right是下标
            for(int j=left; j <= right; j+=len){//直接弄个新map，把当前这个窗口里的拆开， 这题的窗口是固定的其实
                String t = s.substring(j, j+ len);
                t_maps.put(t, t_maps.getOrDefault(t, 0)+1);
            }
            //直接做比对，判断是否合法
            if(t_maps.equals(w_maps)){
                res.add(left);
            }
        }
        return res;
    }

    public static void main(String[] args){
        L30_SubStringWithAllWord l = new L30_SubStringWithAllWord();
        String[] w = new String[]{"a"};
        l.findSubstring("a", w);
    }
}
